Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

298
Vistas
class << self en ruby y sus métodos

Tengo un modelo en ruby on rails con el siguiente código, que usa una definición de clase singelton. Además, algo de lógica de metaprogramación. Pero, no entiendo cuándo se invocará este código. ¿Es cuando se está editando un atributo a continuación especificado?

 class Product < ApplicationRecord class << self ['cat_no', 'effort', 'impact', 'effect', 'feedback'].each do |attr| define_method "update_#{attr}" do |pr, count, user_id| pr.order=pr.cat_no pr.idea=pr.description pr.update("#{attr}"=>count,:last_modified_by=>user_id) end end end end

Por favor ayuda. Gracias

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Este código genera cinco métodos, uno para cada nombre de atributo en la lista. Todos estos métodos generados toman tres argumentos y básicamente se verán así (utilizo el nombre del atributo de impact como ejemplo):

 def self.update_impact(pr, count, user_id) pr.order = pr.cat_no pr.idea = pr.description pr.update("impact" => count, :last_modified_by => user_id) end

Eso significa que hay cinco métodos generados que actualizan el pasado en pr con algunos datos de sí mismo y con un count y un user_id de usuario.

Tenga en cuenta que este método solo trata con un pr específico, por lo tanto, es mejor usar una instancia en lugar de un método de clase como ya sugirió Stefan en su comentario. Y en mi opinión, no hay realmente un beneficio en la metaprogramación aquí. Cambiaría la lógica a

 def update_count(type, count, user_id) # or any another name that makes sense in the domain if type.in?(%i[cat_no effort impact effect feedback]) update( :order => cat_no, :idea => description, :last_modified_by => user_id, type => count ) else raise ArgumentError, "unsupported type '#type'" end end

y llamarlo en lugar de

 Model.update_impact(pr, count, user_id)

Me gusta esto

 pr.update_count(:impact, count, user_id)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda